--[[
  功能：计算两个ZSet的交集（转为Set后操作）
  参数：
    KEYS[1] - 第一个ZSet的key
    KEYS[2] - 第二个ZSet的key
  返回：交集成员列表
--]]
-- 1. 生成临时Set键名（加入随机数和TTL防护）
local random_suffix = tostring(math.random(10000, 99999))
local temp_set1 = 'tmp:inter:' .. KEYS[1] .. ':' .. random_suffix
local temp_set2 = 'tmp:inter:' .. KEYS[2] .. ':' .. random_suffix
local temp_ttl = 600 -- 临时键10分钟过期

-- 2. ZSet转Set（分批处理避免阻塞）
local function zset_to_set(zkey, setkey)
    local cursor = '0'
    repeat
        -- 使用ZSCAN分批获取（每次500元素）
        local reply = redis.call('ZSCAN', zkey, cursor, 'COUNT', 500)
        cursor = reply[1]
        local members = {}
        -- 提取成员（忽略分数）
        for i = 1, #reply[2], 2 do
            table.insert(members, reply[2][i])
        end
        -- 批量添加
        if #members > 0 then
            redis.call('SADD', setkey, unpack(members))
        end
    until cursor == '0'
    -- 设置TTL防止残留
    redis.call('EXPIRE', setkey, temp_ttl)
end

-- 3 执行转换
zset_to_set(KEYS[1], temp_set1)
zset_to_set(KEYS[2], temp_set2)

-- 4. 计算交集
local result_key = 'tmp:inter:result:' .. random_suffix
redis.call('SINTERSTORE', result_key, temp_set1, temp_set2)
local intersection = redis.call('SMEMBERS', result_key)

-- 5. 清理临时键（异步删除）
redis.call('UNLINK', temp_set1, temp_set2, result_key)

-- 6. 返回结果（限制最多10万条）
if #intersection > 100000 then
    return {err = 'RESULT TOO LARGE'}
end
return intersection